﻿/*
*************************************************************************

 Le logiciel de gestion d'EPN

 @project OpenEPN.
 @version 0.1
 @legals  (c) 2008 Damien Maillard, Sébastien Reinders. 
 Needed Components : GTK-Sharp 2.8. 
 Licensed under GPL v2.

 @author  Damien Maillard <damien.maillard@openepn.be>
 @author  Sébastien Reinders <sebastien.reinders@openepn.be>
 @author  Didier Piette <didier.piette@openepn.be>
 @author  Nicolas Karras <nicolas.karras@openepn.be>
 @author  Julien Poulin <julien.poulin@openepn.be>
 @since   2008.02.08
 @latest  

 This program is free software; you can 
 redistribute it and/or modify it under
 the terms of the GNU General Public License as 
 published by the Free Software
 Foundation; either version 2 of the License, or 
 (at your option) any later version.

 This program is distributed in the hope that it 
 will be useful, but WITHOUT ANY WARRANTY; without even 
 the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE. See the GNU General 
 Public License for more details.

 You should have received a copy of the GNU General 
 Public License along with this program; if not, 
 write to the Free Software Foundation, Inc., 59 Temple
 Place, Suite 330, Boston, MA 02111-1307 USA.
 
 * 
 * Conventions de nommage pour les variables locales :
 * m_ : pour les variables membres d'une méthode;
 * g_ : pour les variables membres d'une classe ;
 * c_ : pour les constantes;
 * s_ : pour les variables statiques;
 * e_ : pour les énumérations;
 * a_ : pour les Array et ArrayList;
 *  _ : pour les paramètres passés aux méthodes
 * T_ : T majuscule pour les Threads
 * E_ : E majuscule pour les événements
 * 
 
*************************************************************************
*/

using System;
using System.Collections.Generic;
using System.Text;
using BU.FileStreamClient;
using DA.StreamXml;

namespace GI.BackgrndClient
{
    /// <summary>
    /// Classe de gestion de l'authentification de l'utilisateur dans l'application
    /// </summary>
    public static class Login
    {
        #region "Déclarations"

        private static bool s_corectLogin;
        private static string s_loginName;
        private static string s_loginFirstName;

        private static bool s_alreadyConnected = false;

        #endregion

        #region "Propriété"

        /// <summary>
        /// Permet de déterminer si le login est correct
        /// </summary>
        public static bool correctLogin
        {
            get { return s_corectLogin; }
            set { s_corectLogin = value; }
        }

        /// <summary>
        /// Indique le nom d'utilisateur de la personne utilisant le poste client
        /// </summary>
        public static string nomUtilisateur
        {
            get { return s_loginName; }
            set { s_loginName = value; }
        }

        /// <summary>
        /// Indique le prénom d'utilisateur de la personne utilisant le poste client
        /// </summary>
        public static string prenomUtilisateur
        {
            get { return s_loginFirstName; }
            set { s_loginFirstName = value; }
        }

        /// <summary>
        /// Permet d'établir si l'utilisateur est déjà connecté dans le système
        /// </summary>
        public static bool dejaConnecte
        {
            get { return s_alreadyConnected; }
            set { s_alreadyConnected = value; }
        }


        #endregion

        #region "Implémentations"

        #region #Méthodes privées"

        // Pas de méthodes privées

        #endregion

        #region #Méthodes publiques"

        /// <summary>
        /// Envoie la demande de connexion de l'utilisateur à l'objet Connect
        /// </summary>
        /// <param name="login"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public static Boolean userConnexion(string _login, string _password)
        {
            bool _retourconnexion = GI.BackgrndClient.ConnectionManager.connexionTcp(Param.port, Param.adresseIp);
            
            if (_retourconnexion == true)
            {
                majtextarea(GI.BackgrndClient.ConnectionManager.message);

                bool retourauthentification = ConnectionManager.envoiauthentification(_login, _password);

                if (retourauthentification == true)
                {
                    majtextarea("connexion avec le login : " + _login);
                    return true;
                }

                return false;
            }
            else
            {
                majtextarea(GI.BackgrndClient.ConnectionManager.message);
                return false;
               
                throw new OeExceptions.TcpSocketException(GI.BackgrndClient.ConnectionManager.message);
            }
        }

        /// <summary>
        /// Envoie la demande de déconnexion de l'utilisateur à l'objet Connect
        /// </summary>
        /// <returns></returns>
        public static bool userDeconnexion()
        {
            //ATTENTION :  Soit ici, je supprime cette méthode pour le pas faire double emploi,
            //soit je trouve le moyen de l'exploiter pour analyser les données qui transitent et
            //pour faire en sorte de bloquer les connexions et déconnexions de l'utilisateur
            Boolean _retour = GI.BackgrndClient.Param.TcpConnected;

            if (_retour == true)
            {
                majtextarea(GI.BackgrndClient.ConnectionManager.message);
                GI.BackgrndClient.ConnectionManager.envoideconnection();
                majtextarea("Déconnexion de l'utilisateur: " + s_loginName + " " + s_loginFirstName);
                s_alreadyConnected = true;
                return true;
            }
            else
            {
                majtextarea(GI.BackgrndClient.ConnectionManager.message);
                return false;
            }
        }

        /// <summary>
        /// Méthode qui permet de mettre à jour les informations dans le fichier log
        /// </summary>
        /// <param name="_message">Message à faire passer au format string</param>
        public static void majtextarea(string _message)
        {
            BU.FileStreamClient.StreamFiles.WriteToFile("Le " + Convert.ToString(DateTime.Now) + " " + _message);
        }

        /// <summary>
        /// Méthode qui appelle la lecture du fichier xml pour la vérification des données de l'administrateur local de l'application client
        /// </summary>
        /// <param name="_login">Le login de l'administrateur au format string</param>
        /// <param name="_password">Le mot de passe de l'administrateur au format string</param>
        /// <returns></returns>
        public static bool readAdminLogin(string _login, string _password)
        {
            DA.StreamXml.OptionsConfigXml options = new OptionsConfigXml();
            if ((options.AdminLogin == _login) && (options.AdminPassword == _password))
            {
                return true;  
            }
            else
            {
                return false;
            }   
        }

        #endregion

        #endregion
    }
}
